package com.yjzx.util.service.pay.strategy;

import com.yjzx.util.service.pay.enums.ClientEnum;

import javax.servlet.http.HttpServletRequest;

/**
 * @author yjzx
 * @Description 支付策略
 * @create 2022-12-28 22:39
 */
public interface PayStrategy {
    /**
     * 获取此支付策略的名字
     * @return
     */
    default String getName(){
        return this.getClass().getName();
    }

    /**
     * 支持哪种支付
     *
     * @param type
     * @return
     */
    boolean supports(String type);

    /**
     * 为某个订单展示收银台页面
     * @param orderInfo 订单信息
     * @return
     */
    String cashierPage(OrderInterface orderInfo);

    /**
     * 验证签名
     *
     * @param request 原生请求
     * @param body    请求体数据
     * @param clientEnum
     * @return
     */
    boolean checkSign(HttpServletRequest request, String body, ClientEnum clientEnum);


    /**
     * 验签错误处理
     *
     * @return
     */
    Object signError();


    /**
     * 验签通过返回
     *
     * @return
     */
    Object signOk();

    /**
     * 验签成功后处理通知数据： 把通知的所有数据封装指定对象
     * @param request 原生请求
     * @param body    请求体数据
     * @return
     */
    PaySuccessParam process(HttpServletRequest request, String body);

    /**
     * 退单处理
     *
     * @param orderId 订单id
     * @param clientEnum
     * @return
     */
    boolean payChargebacks(String orderId, ClientEnum clientEnum);

    /**
     * 订单查询
     * @param orderId
     * @param clientEnum
     * @return
     */
    PaySuccessParam payQuery(String orderId, ClientEnum clientEnum);

    /**
     * 获取小程序id
     * @param id
     * @return
     */
    String getMiniOpenId(String id);
}
